package web.项目初始化时运行;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import web.mapper.CommonMapper;
import web.工具类.Redis工具类;
import web.工具类.天行数据;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Component
public class StartRun implements ApplicationRunner {

    @Value("${天行数据1}")
    private String 天行密钥1;

    @Value("${天行数据2}")
    private String 天行密钥2;

    @Value("${天行数据3}")
    private String 天行密钥3;

    @Value("${调用次数}")
    private int 调用次数;

    @Resource
    CommonMapper commonMapper;

    private  static RestTemplate restTemplate = new RestTemplate();

    @Resource
    Redis工具类 redis;

    //这个注解受spring容器控制，在里面执行退出命令不能终止项目
    @PostConstruct
    public  void  webRequest()  {
        System.out.println("项目初始化时运行，开始采集天行数据免费api");
        //执行获取天行数据三部曲
        //第一步，获取 接口名，接口地址，对应密钥
        //第二步，设置请求格式准备并循环请求指定次数
        //第三步，把每次请求的结果写入mysql数据库
        this.QueryTianApi(天行数据.天行数据3,天行密钥3);
        this.QueryTianApi(天行数据.天行数据2,天行密钥2);
        this.QueryTianApi(天行数据.天行数据1,天行密钥1);
    }

    @Override
    public void run(ApplicationArguments args)  {
        System.out.println("结束采集天行数据");
        System.exit(0);
    }

    private void QueryTianApi(HashMap<String,String> 接口集合, String 天行密钥){
        for(Map.Entry<String, String> entry : 接口集合.entrySet()){
            String url=entry.getValue()+"?key="+天行密钥;
            for (int i = 0; i < 调用次数; i++) {
                ResponseEntity<String> entity = null;
                JSONObject 返回json;
                try {
                    Thread.currentThread().sleep(200);//避免请求过于频繁
                    entity= restTemplate.getForEntity(url,String.class);
                    int 接口状态code=entity.getStatusCodeValue();
                    返回json = (JSONObject) JSON.parseObject(entity.getBody()).getJSONArray("newslist").get(0);;
                    commonMapper.插入天行api缓存库(entry.getKey(),接口状态code,返回json.toString());
                }catch (Exception e){
                    if (null!=entity){
                        redis.天行数据api缓存日志(entry.getKey()+"-调用异常"+entity.getBody());
                    }else {
                        redis.天行数据api缓存日志(entry.getKey()+"-网络异常未能正常请求");
                    }
                }
            }
            String temp=entry.getKey()+"调用"+调用次数+"次成功";
            redis.天行数据api缓存日志(temp);
            System.out.println(temp);
        };
    }

}
